Program compilers are instrumental to the creation and development of software programs. Most computer programs are written according to one of several programming languages which conform to a pre-defined structure and syntax and are legible to software engineers and programmers with knowledge of the specific language. Programs written under a programming language are often referred to as source programs, and generally consist of a formatted collection of statements, instructions and declarations arranged according to the particular syntax of the applicable programming language.
However, source programs written in programming languages are not typically directly executable by a computing device. A program compiler is a computer program (or set of associated programs) that translates a source program to a target program (often having a binary form) directly executable by one or more components of a computing device—such as a processor. Typically, compilers are used to translate source code written in a so-called “high-level” programming language to a target program in a “lower level” language, such as assembly or machine code which can be interpreted and executed by a computer processor.
Unfortunately, compilers may have bugs (programming defects) that may cause the compiler to generate an incorrect target program (i.e., a target program that is not semantically equivalent to the source program). When an incorrect target program runs, it may exhibit incorrect or insecure behavior. This behavior may lead to program faults and can be very difficult to track down and eliminate. Conventional approaches to detecting compiler bugs include continuously compiling multiple test programs, running the test programs, and monitoring the resultant executions. These test programs are often implemented as dedicated programs that are written to test a particular feature or set of features of a programming language. Applications that have been published by software companies may be used as test programs as well.
When a compiler is used to compile a test program, any program faults in the compiler may manifest during compilation or, more frequently, during a subsequent execution of the compiled program. However, some program faults may not manifest at all, may manifest after a delay or intermittently, or may manifest only under certain circumstances and conditions which can appear completely arbitrary and difficult to duplicate. As a result, while running test programs may help determine the presence of a bug in the program code, it is still exceedingly difficult and time consuming to identify the location of the specific problem, or even determine if the problematic code is located in the code of the source program or within the compiler itself.